﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cesave.Domain.PermisosModule.Resources;
using Cesave.Domain.Core;
using System.Data;

namespace Cesave.Domain.PermisosModule.Contracts.CultivosClasificaciones
{
	public class CultivoClasificacionService
		: ICultivoClasificacionService
	{

		#region Private properties

		/// <summary>
		/// 
		/// </summary>
		private ICultivosClasificacionRepository _cultivoClasificacionRepository;

		#endregion

		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivosClasificacionRepository"></param>
		public CultivoClasificacionService(ICultivosClasificacionRepository cultivosClasificacionRepository)
		{
			if (cultivosClasificacionRepository == null)
				throw new ArgumentNullException(Messages.exception_DependenciesAreNotInitialized, "cultivosClasificacionRepository");
			_cultivoClasificacionRepository = cultivosClasificacionRepository;
		}

		#endregion

		#region ICultivoClasificacionService Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivoClasificacion"></param>
		public void AddCultivoClasificacion(Entities.CultivoClasificacion cultivoClasificacion)
		{
			if (cultivoClasificacion == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "cultivoClasificacion");
			IUnitOfWork unitOfWork = _cultivoClasificacionRepository.StoreContext;
			_cultivoClasificacionRepository.Add(cultivoClasificacion);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="cultivoClasificacion"></param>
		public void ChangeCultivoClasificacion(Entities.CultivoClasificacion cultivoClasificacion)
		{
			if (cultivoClasificacion == null)
				throw new ArgumentNullException(Messages.exception_InvalidArgument, "cultivoClasificacion");
			IUnitOfWork unitOfWork = _cultivoClasificacionRepository.StoreContext;
			_cultivoClasificacionRepository.Modify(cultivoClasificacion);
			try
			{
				unitOfWork.Commit();
			}
			catch (OptimisticConcurrencyException)
			{
				unitOfWork.RollbackChanges();
				unitOfWork.CommitAndRefreshChanges();
			}
		}

		/// <summary>
		/// 
		/// </summary>
		/// <returns></returns>
		public List<Entities.CultivoClasificacion> FindAllCultivoClasificaciones()
		{
			return _cultivoClasificacionRepository.GetAll().OrderBy(c => c.Nombre).ToList();
		}

		#endregion

		#region IDisposable Members

		/// <summary>
		/// 
		/// </summary>
		public void Dispose()
		{
			if (_cultivoClasificacionRepository != null && _cultivoClasificacionRepository.StoreContext != null)
				_cultivoClasificacionRepository.StoreContext.Dispose();
		}

		#endregion
	}
}
